/*****************************************************************************
 * plum_cal_mqtt.h
 *
 * Copyright (C) 2020 Jeasonvor <1101627719@qq.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 ****************************************************************************/

#ifndef __PLUM_CAL_MQTT_H__
#define __PLUM_CAL_MQTT_H__
/*****************************************************************************
 * Included Files
 ****************************************************************************/
#if !defined(PLUM_API_INCLUDE)
#error "Only 'plum_api.h' can be include directly"
#endif
/*****************************************************************************
 * Pre-processor Definitions
 ****************************************************************************/

/*****************************************************************************
 * Public Types
 ****************************************************************************/

typedef enum {
    MQTT_EVT_CONNECT,       /* 连接成功             */
    MQTT_EVT_DISCON,        /* 断开连接             */
    MQTT_EVT_MSG,           /* 收到mqtt消息         */
    MQTT_EVT_PUB_TIMEOUT,   /* public超时         */
    MQTT_EVT_SUB_TIMEOUT,   /* subscribe超时      */
    MQTT_EVT_CON_TIMEOUT,   /* connect超时        */
    MQTT_EVT_UNSUB_TIMEOUT, /* unsubsribe超时     */
    MQTT_EVT_PING_TIMEOUT,  /* ping超时           */
    MQTT_EVT_UNK_ERR,       /* 未知错误             */
} plum_mqtt_evt_t;

typedef void *plum_mqtt_client_ref_t;

typedef struct {
    plum_s8 *              topic;
    plum_s8 *              payload;
    plum_u16               payloadLen;
    plum_mqtt_client_ref_t client;
} plum_mqtt_msg_t;

/*
 * @brief:   底层写数据回调函数类型定义
 *
 * @param[in]:   wData   -   数据指针
 * @param[in]:   size    -   数据长度
 *
 * @return:  成功      -   返回0
 *           失败      -   返回错误码
 */
typedef plum_s32 (*plum_mqtt_drv_write)(plum_u8 *wData, plum_u16 size);

/*
 * @brief:   底层读数据回调函数类型定义
 *
 * @param[in]:   rData   -   数据指针
 * @param[in]:   size    -   数据长度
 * @param[in]:   timeout -   超时时间
 *
 * @return:  返回读取到的数据长度
 */
typedef plum_s32 (*plum_mqtt_drv_read)(plum_u8 *rData, plum_u16 size,
                                       plum_u32 timeout);

/*
 * @brief:   事件处理回调函数类型定义
 *
 * @param[in]:   evt -   事件ID
 * @param[in]:   arg -   事件参数
 *
 * @return:
 */
typedef plum_void (*plum_mqtt_cb)(plum_mqtt_evt_t evt, plum_void *arg);

/*****************************************************************************
 * Public Data
 ****************************************************************************/

/****************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
/*****************************************************************************
 * Public Function Prototypes
 ****************************************************************************/

/**
 * @brief:	连接MQTT服务器
 *
 * @param[in]:   clientid-   client ID
 * @param[in]:	url		-	服务器地址
 * @param[in]:	port	-	服务器端口号
 * @param[in]:	usr		-	mqtt用户名
 * @param[in]:	passwd	-	mqtt密码
 *
 * @return:	返回mqtt的client对象
 */
plum_mqtt_client_ref_t plum_cal_mqtt_connect(plum_s8 *client_id, plum_s8 *url,
                                             plum_u32 port, plum_s8 *usr,
                                             plum_s8 *passwd);

/**
 * @brief:  断开mqtt连接
 *
 * @param[in]： client      -
 *
 * @return: 返回执行状态
 * **/
plum_s32 plum_cal_mqtt_disconnect(plum_mqtt_client_ref_t client);

/**
 * @brief:	订阅mqtt主题
 *
 * @param[in]:   client  -   mqtt客户端
 * @param[in]:	topic	-	主题
 *
 * @return:	成功	-	返回0
 *			失败	-	返回错误码
 */
plum_s32 plum_cal_mqtt_subscribe(plum_mqtt_client_ref_t client, plum_s8 *topic);

/**
 * @brief:  取消订阅主题
 *
 * @param[in]:  client  -
 * @param[in]:  topic   -    主题
 *
 * @return: 返回执行状态
 * **/
plum_s32 plum_cal_mqtt_unsubscribe(plum_mqtt_client_ref_t client,
                                   plum_s8 *              topic);

/**
 * @brief:	推送mqtt消息
 *
 * @param[in]:   client  -   mqtt client id
 * @param[in]:	msg		-	数据内容指针
 *
 * @return:	成功	-	返回0
 *			失败	-	返回错误码
 */
plum_s32 plum_cal_mqtt_publish(plum_mqtt_client_ref_t client,
                               plum_mqtt_msg_t *      msg);

/**
 * @brief:	mqtt消息处理回调
 *
 * @param[in]:   cb      -   面向应用层的事件通知回调
 *
 * @return:	成功  	-	返回0
 *			失败	    -	返回错误码
 */
plum_s32 plum_cal_mqtt_register_callback(plum_mqtt_cb cb);

/**
 * @brief:  注册mqtt底层的数据收发接口
 *
 * @brief[in]:  read    -   读数据回调
 * @brief[in]:  write   -   写数据回调
 *
 * @return: 返回执行状态
 * **/
plum_s32 plum_cal_mqtt_register_drv_io(plum_mqtt_drv_read  read,
                                       plum_mqtt_drv_write write);

/**
 * @brief:	mqtt状态维护
 *
 * @param:
 *
 * @return:
 *
 * @note:    这是对裸机系统的一个轮询接口，如果有系统，则直接将
 *           这个接口作为一个空函数即可
 */
plum_void plum_cal_mqtt_yield(plum_void);

/****************************************************************************/
#ifdef __cplusplus
}
#endif
/****************************************************************************/
#endif /* __PLUM_CAL_MQTT_H__ */
/****************************************************************************/

/****************************************************************************/
/*                                                                          */
/*  End of file.                                                            */
/*                                                                          */
/****************************************************************************/
